/**
 * Board.java
 *
 * @author Michael Hansen
 * @author Lukas Thuernagel
 * @author Soeren Warszus
 */

package risk.game;

import risk.player.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.event.*;

/**
 * Erstellt das Spielbrett.
 */
public class Board extends JFrame{
    // Arrayliste der teilnehmenden Spieler
    private ArrayList<PlayerModel> alPlayer;
    //Controller wird angelegt
    private FrontController controller = null;
    //Model wird angelegt
    private RiskModel model = null;
    //Anzeige der Karte
    private MapView mv = null;
    //Panel duer die entsprechenden Phase
    private JPanel switchPanel;
    
    /**
     * Board zur Anzeige der Karte und der Spieler
     *
     * @param RiskModel model Das RiskModel was zur Darstellung dem Board uebergeben werden muss.
     */
    public Board(RiskModel model) {
        super("Risiko");
        this.model=model;
        
        // Controller erzeugen
        this.controller = new FrontController(model, this); 
       

        //Playerliste mit Spielern fuellen und Views erzeugen.
        initializePlayerList();
        
        // Einlesen der Karte
        WorldMap wm = model.getWorldMap();
        
        // Anzeige der Karte
        mv = new MapView(wm);
        mv.addMouseListener(this.controller);
        
        GridBagLayout gbl      = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();

        int columnWidths[] = {800, 200};
        int rowHeights[] = {480, 220};
        gbl.columnWidths = columnWidths;
        gbl.rowHeights = rowHeights;
        this.setLayout(gbl);   
        
        // Anzeige der Spielkarte
        gbc.gridx = 0;
	gbc.gridy = 0;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.WEST;
        gbl.setConstraints(mv, gbc);
        this.getContentPane().add(mv);
        
        // Panel zur Anzeige aller Spieler
        JPanel playerPanel = new JPanel();
        GridLayout gl = new GridLayout(6,1,10,10);
        playerPanel.setLayout(gl);
        
        /* Layout der SpielerPanel.
         * Hinzufuegen aller Spielerpanels auf den Panel playPanel
         */
        for(int i=0; i<alPlayer.size();i++){
            PlayerView pv = alPlayer.get(i).getBoardView();
            if (i == 0) {
                pv.setActive(true);
                pv.setState(pv.getPlayerModel().getStateString());
            }
            
            playerPanel.add(pv);
        }
        
        // Spielerpanel mit allen Spielern hinzufuegen
        gbc.gridx = 1;  
	gbc.gridy = 0;  
        gbc.gridheight = 3;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.EAST;
        gbl.setConstraints(playerPanel, gbc);
        this.getContentPane().add(playerPanel);
        
        
        // Anzeigen des Wuerfelpanels
        switchPanel = new JPanel();
        
        //switchPanel.add(new JLabel("Panel folgt ..."));
        switchPanel.setVisible(true);
        gbc.gridx = 0;  
	gbc.gridy = 1; 
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.CENTER;
        gbl.setConstraints(switchPanel, gbc);
        this.getContentPane().add(switchPanel);
        
        
        // Fenster
        JFrame.setDefaultLookAndFeelDecorated(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        this.pack();
        this.setSize(1024, 768);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation((d.width - this.getSize().width) / 2, 
                         (d.height - this.getSize().height) / 2);
        this.setVisible(true);
        
        model.registerView(this);
    }
    
    /**
     * Anlegen der teilnehmenden Spieler
     */
    public void initializePlayerList(){
        alPlayer = model.getPlayer();
        for(int i=0; i<alPlayer.size(); i++){            
            PlayerView pv = new PlayerView(alPlayer.get(i));
            
        }
    }

    /**
     * Ausgabe des Panels, auf dem die Karte liegt
     */
    public MapView getMapView(){
        return this.mv;
    }
    
    /**
     * Wechseln der Panels fuer die entsprechenden Phasen
     *
     * @param JPanel View das Angezeigt werden soll
     */
    public void switchPanel(JPanel p){
        if(p != null){
            this.switchPanel.removeAll();
            p.setVisible(true);
            this.switchPanel.add(p);
            switchPanel.setVisible(true);
            this.validate();
        }
        else{
            switchPanel.add(new JLabel("Panel folgt ..."));
        }
    }
    
    /**
     * Setzen des ersten Panels
     *
     * @param JPanel
     */
    public void setShowPanel(JPanel p){
        this.switchPanel.add(p);
        switchPanel.setVisible(true);
        this.validate();
    }
    
    /**
     * Rueckgabe des FrontController
     *
     * @return FrontController
     */
    public FrontController getController(){
        return this.controller;
    }
}
